package com.bird.thread.base.thread;

/**
 * @author sijunqiang
 * @data 2021/7/1 22:14
 * @description: 内容： 两个线程交替打印0~100的奇偶数，用synchronized关键字实现
 */
public class WaitNotifyPrintOddEvenSyn {
    private static int count = 0;

    private static Object lock = new Object();

    // 1：新建两个线程 一个只处理奇数 一个只处理偶数 (使用位运算)
    // 2: 使用synchronized 实现通信.
    public static void main(String[] args) {

        // 偶数
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (count < 100) {
                    //同步代码块里面-
                    // 当一个线程 进入被synchronized修饰的代码块的时候, 哪个这个线程就持有这个对象的锁。
                    // 其他的线程看到这个锁被其他的的线程持有的话 就会等待重新争取锁资源。
                    // 当一个线程 从synchronized修饰的代码块的时候，这个线程就会释放这把锁。
                    synchronized (lock) {
                        // 这里使用位运算 替代模运算的 原因是 效率高
                        if ((count & 1) == 0) {
                            System.out.println(Thread.currentThread().getName() + " : " + count++);
                        }
                    }

                }

            }
        },"偶线程").start();

        // 奇线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (count < 100) {
                    //同步代码块里面-
                    synchronized (lock) {
                        // 这里使用位运算 替代模运算的 原因是 效率高
                        if ((count & 1) == 1) {
                            System.out.println(Thread.currentThread().getName() + " : " + count++);
                        }
                    }
                }

            }
        },"奇线程").start();
    }
}
